package com.cskaoyan.javase.oop2._1extends._3advantage;

/**
 * 这里给出一个继承语法的练习案例，通过案例我们来分析一下继承的优缺点：
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子，这些鸭子有一些共同的属性，也有共同的行为，比如都可以叫，都会游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优点:
 *      1.继承的出现减少了代码冗余，提高了代码的复用性。
 *      2.继承的出现，更有利于功能的扩展，提升了程序的可维护性，更好地应对需求变更。
 *      3.扩展一点：
 *          继承的出现，对于Java的引用类型而言，弱化了类型的约束力，引用数据类型出现了数据类型转换的概念。
 *          这其实是Java实现面向对象第三个特征——多态的前提。
 *
 * 继承的缺点:
 *      子类继承父类必须无条件接收父类的所有成员，是没有选择的。
 *      父类中对成员进行修改，会严格体现到每一个子类中，我们不可选择具体哪个子类生效。
 *      扩展:
 *      虽然Java中子类不可以选择继承父类成员
 *      但是子类在继承父类成员方法的时候
 *      可以在继承的基础上重写父类方法的实现
 *      这种语法称之为"方法的重写(Override)/方法的覆盖"
 *      继承是面向对象的核心
 *      "方法的重写"是继承的核心
 *
 *      重写归重写,但是终究还是要继承
 *
 *
 * @since 09:40
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        FirstTypeDuck ftd = new FirstTypeDuck();
        // ftd.swim();
        ftd.shout();
        ftd.fly();

        ForthTypeDuck ftd2 = new ForthTypeDuck();
        ftd2.fly();
    }
}

// 父类
class DuckFather {
    public void shout() {
        System.out.println("嘎嘎嘎~");
    }

    /*public void swim() {
        System.out.println("春江水暖鸭先知~");
    }*/
    public void fly() {
        System.out.println("原来大家都是丑小鸭~");
    }
}

class FirstTypeDuck extends DuckFather {
}

class SecondTypeDuck extends DuckFather {
}

class ThirdTypeDuck extends DuckFather {
}
class ForthTypeDuck extends DuckFather{
    // 我是鸭子,但我不会飞
    @Override
    public void fly() {
        System.out.println("我是特殊的鸭子,我天生就不会飞!");
    }
}